<?php

/**
 * This is the model class for table "zones".
 *
 * The followings are the available columns in table 'zones':
 * @property integer $id
 * @property string $nom
 * @property string $modeid
 * @property integer $ordre
 * @property string $jusqua
 */
class Zone extends CActiveRecord {


    /**
     * Returns the static model of the specified AR class.
     * @param string $className active record class name.
     * @return Zone the static model class
     */
    public static function model($className = __CLASS__) {
	  return parent::model($className);
    }

    /**
     * @return string the associated database table name
     */
    public function tableName() {
	  return 'chauffage_zones';
    }

    /**
     * @return array validation rules for model attributes.
     */
    public function rules() {
	  // NOTE: you should only define rules for those attributes that
	  // will receive user inputs.
	  return array(
		array('ordre', 'numerical', 'integerOnly' => true),
		array('nom', 'length', 'max' => 45),
		array('modeid', 'length', 'max' => 15),
		array('jusqua', 'safe'),
		  // The following rule is used by search().
		  // Please remove those attributes that should not be searched.
		  //array('id, nom, modeid, ordre, jusqua', 'safe', 'on'=>'search'),
	  );
    }

    /**
     * @return array relational rules.
     */
    public function relations() {
	  // NOTE: you may need to adjust the relation name and the related
	  // class name for the relations automatically generated below.
	  return array(
		'mode' => array(self::BELONGS_TO, 'Mode', 'modeid'),
		'horaires' => array(self::HAS_MANY, 'Horaire', 'zoneid', 'order' => 'periodeid, heure'),
	  );
    }

    /**
     * @return array customized attribute labels (name=>label)
     */
    public function attributeLabels() {
	  return array(
		'id' => 'ID',
		'nom' => 'Nom',
		'modeid' => 'Mode',
		'ordre' => 'Ordre',
		'jusqua' => 'Jusqu\'à',
	  );
    }

    public function behaviors() {
	  return array('ESaveRelatedBehavior' => array(
		    'class' => 'ESaveRelatedBehavior')
	  );
    }


    /**
     * Récupération du mode en cours (selon la programmation si auto)
     * 
     * @return object mode
     */
    public function getModeCourant() {

	  $currentModeid = null;

	  // Mode manuel => on vérifie si le mode manuel est expiré ou non
	  if ($this->modeid != 'auto') {
		//$jusquaObsolete = $this->jusqua <> '' && $this->jusqua < date();
		$jusquaObsolete = false;

		// Jusquà is expected => return to auto mode
		if ($jusquaObsolete) {
		    $this->desactiverJusqua();
		}

		// Otherwise return current mode
		else {
		    $currentModeid = $this->modeid;
		}
	  }

	  // Si mode auto, on applique les horaires
	  if ($this->modeid == 'auto') {
		$jour = date('N'); // Jour de la semaine (lundi = 1)
		$periodeid = $jour < 6 ? "S" : "W";     // Période horaire
		// Récupération de la plage horaire contenant l'heure courante pour la période concernée (Semaine / Weekend)
		// Default criteria
		$criteriaDefault = new CDbCriteria(array('order' => 'heure DESC', 'limit' => 1));
		$criteriaDefault->addCondition("heure <= CURRENT_TIME");
		$criteriaDefault->addColumnCondition(array('zoneid' => $this->id));

		$criteria = $criteriaDefault;
		$criteria->addColumnCondition(array('periodeid' => $periodeid));
		$horaire = Horaire::model()->find($criteria);


		// On a un horaire pour la plage demandée => on récupère le mode			
		if (!is_null($horaire->id)) {
		    $currentModeid = $horaire->modeid;
		}

		// Sinon on doit récupérer le mode de la plage précédente
		else {
		    switch ($jour) {
			  // Lundi => On récupère la dernière plage du WE (plage à cheval entre le dimanche soir et le lundi matin)
			  case 1:
				$periodeidprec = 'W';
				break;

			  // Samedi => On récupère la dernière plage de la semaine (plage à cheval entre le vendredi soir et le samedia matin)
			  case 6:
				$periodeidprec = 'S';
				break;

			  // Autres jours : du mardi au vendredi + dimanche) => On récupère la dernière plage de la période en cours (la veille)
			  default:
				$periodeidprec = $periodeid;
		    }

		    // On prend le dernier horaire du jour précédent
		    $criteria = $criteriaDefault;
		    $criteria->addColumnCondition(array('periodeid' => $periodeidprec));
		    $horaire = Horaire::model()->find($criteria);

		    // On a un horaire pour la plage demandée => on récupère le mode
		    if (!is_null($horaire->id)) {
			  $currentModeid = $horaire->modeid;
		    }
		    /*
		      else {
		      return null;
		      }
		     */
		}
	  }

	  // Renvoi d'un objet si mode trouvé
	  return is_null($currentModeid) ? null : Mode::model()->findByPk($currentModeid);
    }

    public function activerMode($modeid = null) {

	  // Si un mode est spécifié, on le prend
	  if (!is_null($modeid)) {
		$mode = Mode::model()->findByPk($modeid);
	  }

	  // Sinon, on prend le mode en cours
	  if (is_null($mode)) {
		$mode = $this->getModeCourant();
	  }

	  if (is_null($mode)) {
		echo "Mode inconnu\n";
	  } else {

		echo "Activation du mode " . $mode->mode . " pour la zone \"" . $this->nom . "\"\n";
		// Récupération des relais pos et neg
		$relaiPos = Relai::model()->find('zoneid=:zoneid AND alternance=:alternance', array(':zoneid' => $this->id, ':alternance' => 'pos'));
		$relaiNeg = Relai::model()->find('zoneid=:zoneid AND alternance=:alternance', array(':zoneid' => $this->id, ':alternance' => 'neg'));

		//var_dump($relaiPos);
		//var_dump($relaiNeg);
		// Activation des relais
		$relaiPos->setEtat($mode->ordrePos);
		$relaiNeg->setEtat($mode->ordreNeg);
	  }
    }

    /**
     * Retrieves a list of models based on the current search/filter conditions.
     * @return CActiveDataProvider the data provider that can return the models based on the search/filter conditions.
     */
    /*
      public function search()
      {
      // Warning: Please modify the following code to remove attributes that
      // should not be searched.

      $criteria=new CDbCriteria;

      $criteria->compare('id',$this->id);
      $criteria->compare('nom',$this->nom,true);
      $criteria->compare('modeid',$this->modeid,true);
      $criteria->compare('ordre',$this->ordre);
      $criteria->compare('jusqua',$this->jusqua,true);

      return new CActiveDataProvider($this, array(
      'criteria'=>$criteria,
      ));
      }
     */
}